/************************************************************************
** Copyright 2007 Einar Otto Stangvik
** 
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
** 
**    http://www.apache.org/licenses/LICENSE-2.0
** 
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

#pragma once

#include "PickupPolicyProvider.h"

namespace ThreadSynch
{
	class APCPickupPolicy : public PickupPolicyProvider
	{
	public:
		static void scheduleThreadCallback(DWORD dwThreadId, PCALLBACK pCallbackFunction, ULONG_PTR ulpFunctionParameter)
		{
			HANDLE hThread = OpenThread(THREAD_SET_CONTEXT, FALSE, dwThreadId);
			if(hThread == NULL)
			{
				throw PickupSchedulingFailedException();
			}

			BOOL bSuccessful = QueueUserAPC(reinterpret_cast<PAPCFUNC>(pCallbackFunction), hThread, ulpFunctionParameter);
			CloseHandle(hThread);
			if(!bSuccessful)
			{
				throw PickupSchedulingFailedException();
			}
		}
	};
}